<?php

/**
 * 授权相关操作
*/
class OAuth2Controller extends BaseController {
    protected $app_type = '';  //应用类型
    protected $userId = '';
    /**
     * 请求控制器方法之前先校验一下是否OAuth2授权过，如果没有授权跳授权OAuth2链接
     * 授权的信息存在cookie中
    */
    public function init() {
        parent::init();
        //如果cookie中存放了用户信息，说明前面的操作已经进行了授权，可以调用控制器方法
        $userId = Cookie::get('UserId');
        if ($userId !== false) {
            $this->userId = base64_decode($userId);
            return;
        }
        /*****如果没有cookie,说明没有授权或已经过时间，走下面的授权逻辑******/
        if (Yii::app()->request->isAjaxRequest) {
            //ajax请求给出未授权提示
            $this->error('未授权或授权信息过期');
        }
        $is_success = $this->getUserByCode(); //根据回调返回的code去获取用户信息，如果能获取成功，直接走控制器后面的逻辑
        if ($is_success) {
            return;
        }
        $this->wechatOAuth();
    }

    /**
     * 根据微信应用，生成OAuth认证链接，并跳转过去
    */
    private function wechatOAuth() {
        $wechat_config = Yii::app()->params['wechat'];
        if (empty($wechat_config['corpid'])) {
            $this->error('企业Id未配置');
        }
        $app_type = $this->app_type;
        if (empty($app_type) || empty($wechat_config['app'][$app_type]['AgentId'])) {
            $this->error('应用参数未配置');
        }
        $app_id = $wechat_config['app'][$app_type]['AgentId'];
        $redirect_uri = Yii::app()->request->hostInfo . Yii::app()->request->getUrl(); //使用当前的url做回调地址
        $params = array(
            'appid' => $wechat_config['corpid'],
            'redirect_uri' => $redirect_uri,
            'response_type' => 'code',
            'scope' => 'snsapi_base',
            'agentid' => $app_id,
            'state' => 'STATE'
        );
        $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query($params) . '#wechat_redirect';
        $this->redirect($url);
        exit;
    }

    /**
     * 通过code获取授权用户信息
     * 如果没有带code说明不是微信段调整过来的，返回false,走后面的授权逻辑
     * 获取到的用户信息存入cookie
     * @return bool 是否获取到code
    */
    private function getUserByCode() {
        $code = Yii::app()->request->getQuery('code');
        $state = Yii::app()->request->getQuery('state');
        //如果没有code,state说明当前请求不是微信的回调，终止后面的逻辑
        if (empty($code) || empty($state)) {
            return false;
        }
        $app_type = $this->app_type;
        try {
            $api = new WechatApi($app_type);
        } catch (CException $e) {
            $this->error($e->getMessage());
        }
        $user_info = $api->getUserByCode($code);
        if ($user_info['errcode'] != 0) {
            $this->error($user_info['errmsg']);
        }
        $this->userId = $user_info['UserId'];
        Cookie::set('UserId', base64_encode($user_info['UserId']), 7200);  //写入cookie中
        return true;
    }
}